﻿using System;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
namespace testConvert
{
    class Program
    {
        static void Main(string[] args)
        {
            // 【1】使用自定义的 TypeConverter
            MyClassTypeConverter converter = new MyClassTypeConverter();
            if (converter.CanConvertFrom(typeof(string)))
            {
                // 将 null 字面量或可能为 null 的值转换为非 null 类型。
                MyClass? myInstance1 = converter.ConvertFrom("Some string value") as MyClass;
                System.Console.WriteLine($"转换成功:{myInstance1?.Value}");
            }
            //【2】与特性结合。自动查找转换器
            var myClassConverter = TypeDescriptor.GetConverter(typeof(MyClass));
            MyClass? myInstance2 = (MyClass?)myClassConverter.ConvertFrom("测试");
            System.Console.WriteLine($"特性转换成功:{myInstance2?.Value}");
        }
    }

    //TypeConverterAttribute与 TypeDescriptor 类协同工作，允许你对类型和属性执行自定义转换
    [TypeConverter(typeof(MyClassTypeConverter))]
    // 假设 MyClass 是你的自定义类型，具有一个名为 Value 的字符串属性
    public class MyClass
    {
        public string? Value { get; set; }
    }
    // 创建一个继承自 TypeConverter 的自定义转换器
    public class MyClassTypeConverter : TypeConverter
    {
        // 判定是否可以从 string 类型转换
        public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)
        {
            if (sourceType == typeof(string))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }
        // 定义从 string 到 MyClass 的转换逻辑
        public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture,
                                             object value)
        {
            if (value is string stringValue)
            {
                return new MyClass { Value = stringValue };
            }
            return base.ConvertFrom(context, culture, value);
        }
        // (根据需要还可以覆写 CanConvertTo 和 ConvertTo)
    }
}


